home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Franz PD
/
Franz PD Disk #119 (1991-03)(Amiga User Group Deutschland e.V.).zip
/
Franz PD Disk #119 (1991-03)(Amiga User Group Deutschland e.V.).adf
/
Assembler_Programme
/
text.source
< prev
next >
Wrap
Text File
|
1989-07-03
|
8KB
|
193 lines
;**************** TEXT x,y,vf,hf,"..."*****************
;* *
;* Gibt einen Text an den Punktkoordinaten x,y in *
;* den Farben vf und hf aus. *
;* *
;* x = 0 - 639 \ *
;* > je nach Fenstergröße (CLI = 640x200)*
;* y = 0 - 255 / *
;* *
;* vf = Vorder- und hf = Hintergrundfarbe (0-31) *
;* *
;* "..." = Text *
;******************************************************
;* © Juli 1989 by Michael Gottwald *
;******************************************************
OpenLib = -408
CloseLib = -414
Move = -240
Text = -60
SetAPen = -342
SetBPen = -348
Exit = -144
;----Librarys öffnen--------------------------------------------------
run: move.l a0,Pointer ;Zeiger auf Parametertext retten
subq #1,d0
beq error ;keine Parameter ? - dann Fehler
move.l $4,a6
lea Dosname,a1
jsr OpenLib(a6) ;Dos.Library öffnen
move.l d0,DosBase
lea GfxName,a1
jsr OpenLib(a6) ;Graphics.Library öffnen
move.l d0,GfxBase
lea IntName,a1
jsr OpenLib(a6) ;Intuition.Library öffnen
move.l d0,IntBase
;----Aktuellen RastPort holen und speichern---------------------------
move.l d0,a0
move.l 52(a0),a0 ;A0 = aktuelle Fensterstruktur
move.l 50(a0),RastPort ;Zeiger auf RastPort holen
;----X-Position holen ------------------------------------------------
move.l Pointer,a0 ;Zeiger auf Parametertext holen
bsr getdez ;1-3 stellige Dezimalzahl holen
move.l d0,d3 ;X-Position retten
cmp.w #639,d0 ;größer als 639 ?
bgt error ;ja, dann Fehler
;----Y-Position holen und Cursorposition setzen-----------------------
bsr chkcom ;auf Komma prüfen
bne error ;Nein, dann Fehler
bsr getdez ;Dezimalzahl (Y-Position) holen
cmp.w #255,d0 ;größer als 255 ?
bgt error ;ja, dann Fehler
move.l a0,Pointer ;Parametertext-Zeiger retten
move.l GfxBase,a0
move.l d0,d1 ;Y-Position nach D1...
move.l d3,d0 ;X-Position nach D0...
move.l RastPort,a1 ;RastPort nach A1...
jsr Move(a0) ;...und Cursorposition setzen
;----Vorder- und Hintergrundfarbe holen und setzen--------------------
move.l Pointer,a0
bsr chkcom ;auf Komma prüfen
bsr getdez ;Vordergrundfarbe holen
cmp.b #31,d0 ;größer als 31 ?
bgt error ;dann Fehler
move.b d0,APen ;D0 retten
bsr chkcom ;auf Komma prüffen
bsr getdez ;Hintergrundfarbe holen
cmp.b #31,d0
bgt error
move.l a0,Pointer
move.l RastPort,a1
move.l GfxBase,a6
jsr SetBPen(a6) ;Hintergrundfarbe setzen
move.b APen,d0 ;Vordergrundfarbe zurückholen
move.l RastPort,a1
move.l GfxBase,a6
jsr SetAPen(a6) ;Vordergrundfarbe setzen
;----Text holen und ausgeben------------------------------------------
move.l Pointer,a0
bsr chkcom ;auf Komma prüfen
chkup: cmp.b #34,(a0)+ ;kommen Anführungstriche ?
bne error ;nein, dann Fehler
move.l a0,Pointer ;Textanfangsadresse abspeichern
clr.l d0 ;Textlänge-Zähler = 0
search: addq.l #1,d0 ;Zeichen zählen...
cmp.b #70,d0 ;mehr als 70 Zeichen ?
bgt error ;kann nicht sein -> Fehler
cmp.b #34,(a0)+ ;kommen Anführungsstriche ?
bne search ;nein, dann weiterzählen
subq.l #1,d0 ;D0 - 1 = Textlänge
move.l RastPort,a1
move.l Pointer,a0 ;Textanfang
move.l GfxBase,a6
jsr Text(a6) ;Text ausgeben
;----Ordnungsgemäß aus dem CLI aussteigen-----------------------------
end: clr.l d1 ;Return-Code = 0 (kein Fehler)
end2: move.l $4,a6
move.l IntBase,a1
jsr CloseLib(a6) ;Intuition.Library schließen
move.l GfxBase,a1
jsr CloseLib(a6) ;Graphics.Library schließen
move.l DosBase,a6
jsr Exit(a6) ;beenden
rts
;----Dezimalzahl auswerten--------------------------------------------
getdez: cmp.b #32,(a0)+ ;Leerzeichen überlesen
beq getdez
subq.l #1,a0
move.l #2,d1 ;Ziffernzähler setzen
clr.l d0
clr.w Numbers
loop2: move.b (a0)+,d0 ;nächstes Zeichen holen
cmp.b #13,d0 ;Carriage_Return ?
beq ready ;dann keine Ziffer mehr
cmp.b #44,d0 ;Komma ?
beq back ;dann keine Ziffer mehr
lea Numbers,a1 ;Basisadresse der Ziffernspeicher
add.l d1,a1
sub.l #48,d0 ;ASCII-Code - 48 = Zifferwert
move.b d0,(a1) ;Ziffer abspeichern
dbra d1,loop2 ;D1 dekrementieren / D1 = 0 ?
bra ready
back: subq.l #1,a0 ;A0 wieder auf Komma biegen
ready: addq.w #1,d1
clr.l d0
cmp.b #3,d1 ;D1 noch 2 ?
bne cont
add.l #4,a7 ;ja, dann keine Ziffer gefunden
bra error ;-> Fehler
cont: lea Muls,a2 ;Basisadresse der Multiplikatoren
add.l d1,a2
lea Numbers,a1
clr.l d0
clr.l d1
clr.l d2
move.b 2(a1),d0 ;/Beide Bytes holen, damit wort-
move.b (a2),d1 ;\weise multipliziert werden kann
mulu d1,d0 ;1. Ziffer * Multiplikator
addq.l #1,a2
move.b 1(a1),d1
move.b (a2),d2
mulu d2,d1 ;2. Ziffer (falls vorhanden)
add.w d1,d0
move.b (a1),d1
add.w d1,d0 ;+ 1. Ziffer (falls vorhanden)
rts ;zurück (D0 enthält Dezimalzahl)
;----Auf Komma prüfen-------------------------------------------------
chkcom: cmp.b #32,(a0)+ ;Leerzeichen überlesen
beq chkcom
subq.l #1,a0
cmp.b #44,(a0)+ ;kommt Komma ?
beq ok ;ja, dann zurück
add.l #4,a7 ;Stapelzeiger zurückstellen
bra error
ok: rts
;----Fehler (und beenden)---------------------------------------------
error: move.l #1,d1 ;Return-Code = 1 (Fehler)
bra end2
;---------------------------------------------------------------------
even
DosName: dc.b "dos.library",0
DosBase: dc.l 0
GfxName: dc.b "graphics.library",0,0
GfxBase: dc.l 0
IntName: dc.b "intuition.library",0
IntBase: dc.l 0
Pointer: dc.l 0
RastPort: dc.l 0
Numbers: dc.b 0,0,0 ;Ziffernspeicher
Muls: dc.b 100,10,1,1 ;Multiplikatoren
APen: dc.b 0 ;Zwischenspeicher für Vor.gr.farbe